package com.zwps.biz.controller.http;

import com.zwps.biz.domain.service.FileRecordBizService;
import com.zwps.biz.api.model.dto.file.record.biz.*;
import com.zwps.biz.api.model.vo.file.record.FileVO;
import com.zwps.biz.api.model.vo.file.record.biz.FileRecordBizVO;
import com.zwps.biz.api.model.vo.file.record.biz.SelectFileRecordBizPageVO;
import com.zwps.common.controller.response.message.ResponseDataPageMessage;
import com.zwps.common.core.exception.UserActionException;

import cn.hutool.core.util.StrUtil;
import io.swagger.v3.oas.annotations.Operation;
import io.swagger.v3.oas.annotations.Parameter;
import io.swagger.v3.oas.annotations.enums.ParameterIn;
import io.swagger.v3.oas.annotations.tags.Tag;
import lombok.AllArgsConstructor;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.*;
import java.util.List;
import java.util.Map;
import javax.validation.Valid;
import javax.validation.constraints.NotBlank;
import javax.validation.constraints.NotNull;

/**
 * 业务的文件记录
 * 
 * @ClassName: FileRecordBizController
 * @Description:
 * @author lyh
 * @date 2023年5月28日 上午9:43:25
 *
 */
@Tag(name = "业务关联文件记录")
@RestController
@RequestMapping("file/record/biz")
@AllArgsConstructor
@Validated
public class FileRecordBizController {

    private FileRecordBizService fileRecordBizService;

    @Operation(summary = "查询文件记录列表")
    @GetMapping("list")
    public List<FileRecordBizVO> selectFileRecordPage(SelectFileRecordBizDTO dto) {
        if (StrUtil.isEmpty(dto.getBizTable())) {
            throw new UserActionException("业务表不能为空");
        }
        if (StrUtil.isEmpty(dto.getBizId())) {
            throw new UserActionException("业务数据ID不能为空");
        }
        return fileRecordBizService.selectFileRecordBizs(dto);
    }

    @Operation(summary = "新增文件记录关联")
    @PostMapping
    public void addFileRecordBizs(@Valid @NotNull @RequestBody AddFileRecordBizDTO dto) {
        fileRecordBizService.addFileRecordBizs(dto);
    }

    @Operation(summary = "差异更新文件记录关联（旧的删除、新的新增、相同的不变）")
    @PutMapping
    public void differUpdateFileRecordBizs(@Valid @NotNull @RequestBody DifferUpdateFileRecordBizDTO dto) {
        fileRecordBizService.differUpdateFileRecordBizs(dto);
    }

    @Operation(summary = "删除文件记录关联")
    @DeleteMapping
    public void deleteFileRecordBizs(@Valid @NotNull DeleteFileRecordBizDTO dto) {
        if (StrUtil.isEmpty(dto.getBizTable())) {
            throw new UserActionException("业务表不能为空");
        }
        if (StrUtil.isEmpty(dto.getBizId())) {
            throw new UserActionException("业务数据ID不能为空");
        }
        fileRecordBizService.deleteFileRecordBizs(dto);
    }

    /**
     * 
     * @Title: batchDeleteFileRecordBizs
     * @Description: 
     * @param dto void
     * @author lyh
     * @date 2023年8月16日 下午7:19:58
     */
    @Operation(summary = "删除文件记录关联")
    @DeleteMapping("batch")
    public void batchDeleteFileRecordBizs(@Valid @NotNull BatchDeleteFileRecordBizDTO dto) {
        if (StrUtil.isEmpty(dto.getBizTable())) {
            throw new UserActionException("业务表不能为空");
        }
        fileRecordBizService.batchDeleteFileRecordBizs(dto);
    }
    
    /**
     * 查询指定业务ID的文件列表
     * @Title: selectFiles
     * @Description: 
     * @param bizTable
     * @param bizId
     * @return List<FileVO>
     * @author lyh
     * @date 2023年8月16日 上午10:44:47
     */
    @GetMapping("files")
    public List<FileVO> selectFiles(@RequestParam @Valid @NotBlank String bizTable,
            @Valid @NotBlank @RequestParam String bizId) {
        return fileRecordBizService.selectFiles(bizTable, bizId);
    }

    /**
     * 查询文件关联记录列表
     * @Title: selectFileRecordBiz
     * @Description:
     * @param dto
     * @return List<FileRecordBizVO>
     * @author cg
     * @date 2023年9月9日 上午10:44:47
     */
    @GetMapping("file_record_biz")
    public List<FileRecordBizVO> selectFileRecordBiz(@RequestParam("fileId") String fileId){
        return fileRecordBizService.selectFileRecordBiz(fileId);
    }

    /**@Description: 分页查询文件关联记录列表
     * @param dto
     * @return
     * @author shanwen
     * @date 2023/9/15
     */
    @Operation(summary = "分页查询文件关联记录列表")
    @GetMapping("page")
    public ResponseDataPageMessage<SelectFileRecordBizPageVO> selectFileRecordBizPage(SelectFileRecordBizPageDTO dto) {
        return ResponseDataPageMessage.data(fileRecordBizService.selectFileRecordBizPage(dto));
    }

    @Operation(summary = "新增文件关联记录列表")
    @PostMapping("/add")
    public void addFileRecordBiz(@Valid @NotNull @RequestBody AddRecordBizDTO dto) {
        fileRecordBizService.addFileRecordBiz(dto);
    }

    @Parameter(name = "id", description = "文件关联记录列表主键ID", in = ParameterIn.PATH)
    @Operation(summary = "修改文件关联记录列表")
    @PutMapping("{id}")
    public void updateFileRecordBiz(@Valid @NotBlank @PathVariable String id,
                                           @Valid @NotNull @RequestBody UpdateRecordBizDTO dto) {
        fileRecordBizService.updateFileRecordBiz(id, dto);
    }

    @Operation(summary = "批量删除文件关联记录列表")
    @DeleteMapping("{ids}")
    public void deleteFileRecordBiz(@Valid @NotBlank @PathVariable String ids) {
        fileRecordBizService.deleteFileRecordBiz(ids);
    }



    /**
     * 查询业务ID集合下的文件列表
     */
    @Operation(summary = "查询业务ID集合下的文件列表")
    @GetMapping("biz_files")
    public Map<String, List<FileVO>> batchSearchFiles(@RequestParam("bizTable") @Valid @NotBlank String bizTable,
                                                      @Valid @NotNull @RequestParam("bizIds") List<String> bizIds) {
        return fileRecordBizService.batchSearchFiles(bizTable, bizIds);
    }
}
